function serialize(data) {
    let result = "";
    for (const key in data) {
        result += `${key}=${data[key]}&`
    }
    return result.slice(0, -1);
}

function $ajax(options = {}) {
    const { url, method = "GET", data = {}, callback, error, isJson = true } = options;

    const xhr = new XMLHttpRequest();
    xhr.responseType = "json";

    // 判断该次请求是否为 GET 请求，如果是，则需要将参数拼接到 url 上
    if (method.toLowerCase() === 'get') {
        xhr.open('GET', `${url}?${serialize(data)}`)
        xhr.send();
    } else {
        // 由于请求方式还存在 PUT、DELETE，这些方式的数据同样要携带到请求体上
        xhr.open(method, url);

        // 判断请求体是否需要以 JSON 格式发送
        if (isJson) {
            xhr.setRequestHeader("Content-Type", "application/json;charset=utf-8");
            xhr.send(JSON.stringify(data))
        } else {
            xhr.setRequestHeader("Content-Type", "application/x-www-urlencoded;charset=utf-8");
            xhr.send(serialize(data));
        }
    }

    xhr.addEventListener("load", function () {
        if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
            callback && callback(xhr.response)
        } else {
            error && error(xhr.response)
        }
    })
}